﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Singleton
{
    public class Emperor
    {
        //变量被声明为 volatile，以确保只有在实例变量分配完成后才能访问实例变量
        private static volatile Emperor emperor;

        //此方法使用 syncRoot 实例来进行锁定（而不是锁定类型本身），以避免发生死锁
        private static object syncRoot = new Object();
        private Emperor() { }

        public static Emperor Instance
        {
            get {
                //此 double-check locking 方法解决了线程并发问题，同时避免在每个 Instance 属性方法的调用中都出现独占锁定。
                //它还允许您将实例化延迟到第一次访问对象时发生。实际上，应用程序很少需要这种类型的实现。
                //大多数情况下，静态初始化方法已经够用。
                if (emperor == null)
                {
                    lock (syncRoot)
                    {
                        if (emperor == null)
                        {
                            emperor = new Emperor();
                        }
                    }
                }
                return emperor;
            }
        }

    }
}
